// mycomponent/calendar_hotel/index.js
const dayjs = require('../../utils/dayjs.min')
const App = getApp()
Component({

  /**
   * 组件的属性列表
   */
  properties: {
    startTime: {
      type: String,
      value: ''
    },
    endTime: {
      type: String,
      value: ''
    },
    hotelId: {
      type: String | Number,
      value: ''
    },
    systimestr:{
      type: String | Number,
      value: ''
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
    calendar: [],
    // 构建顶部日期时使用
    date: ['日', '一', '二', '三', '四', '五', '六'],
    inTime: '', //入住时间
    outTime: '', //离开时间
    text_in: '入住',
    old_id:-1,
    old_title:'',
    dateContainer: null,
    rangeDays: 6,
    isSetDefault: false,
    topView: 0,
    priceGetting: false
  },

  /**
   * 组件生命周期函数
   */
  lifetimes: {
    attached: function() {
      
    },

    ready() {
      // const todayStr = dayjs(this.data.startTime).format('YYYY-MM-DD')
      // const endDayStr = dayjs(todayStr).add(this.data.rangeDays, 'day').format('YYYY-MM-DD')
      // this.getPriceRange(todayStr, endDayStr)
    }
  },

  /**
   * 组件的方法列表
   */
  methods: {
    setSystemTime(){
      // 在组件实例进入页面节点树时执行
      var that = this;
      // 获取本月时间
      var nowTime = new Date(this.data.systimestr);
      var year = nowTime.getFullYear();
      var month = nowTime.getMonth();
      var time = [];
      var timeArray = {};
      // 当日为本月第一天且6点前需要渲染上一月日期用来选择今日凌晨；
      if (dayjs(this.data.systimestr).date() == 1 && dayjs(this.data.systimestr).hour() < 6) {
        var y = month == 0 ? year - 1 : year
        var m = month == 0 ? 12 : month
        time = that.dataInit(y, m);
        var yStr = y + '年'
        var mStr = (m < 10 ? '0' + m : m) + '月'
        timeArray[yStr + mStr] = time
      }
      // 循环6个月的数据
      for (var i = 0; i < 6; i++) {
        year = month + 1 > 12 ? year + 1 : year;
        month = month + 1 > 12 ? 1 : month + 1;
        // 每个月的数据
        time = that.dataInit(year, month);
        // 接收数据
        timeArray[year + '年' + (month < 10 ? '0' + month : month) + '月'] = time;
      };
      that.setData({
        calendar: timeArray,
        dateContainer: that.createSelectorQuery().select('.date-box'),
      });
      const todayStr = dayjs(this.data.startTime).format('YYYY-MM-DD')
      const endDayStr = dayjs(todayStr).add(this.data.rangeDays, 'day').format('YYYY-MM-DD')
      this.getPriceRange(todayStr, endDayStr)
    },
    // 日历初始化
    dataInit(setYear, setMonth) {
      var now_today = dayjs(this.data.systimestr).format('YYYY-MM-DD')
      console.log(now_today,'-----------now_today')
      var yesterday = dayjs(this.data.systimestr).subtract(1, 'day').format('YYYY-MM-DD');
      var hour = dayjs(this.data.systimestr).hour()
      // 当前时间/传入的时间
      var now = setYear ? new Date(setYear, setMonth) : new Date(this.data.systimestr);
      var year = setYear || now.getFullYear();
      // 传入的月份已经加1
      var month = setMonth || now.getMonth() + 1;
      // 构建某日数据时使用
      var obj = {};
      // 需要遍历的日历数组数据
      var dateArr = [];
      // 需要的格子数，为当前星期数+当月天数
      var arrLen = 0;
      // 该月加1的数值，如果大于11，则为下年，月份重置为1 
      // 目标月1号对应的星期
      var startWeek = new Date(year + '-' + (month < 10 ? '0' + month : month) + '-01').getDay();
      //获取目标月有多少天
      var dayNums = new Date(year, month < 10 ? '0' + month : month, 0).getDate();
      var num = 0;
      // 计算当月需要的格子数 = 当前星期数+当月天数
      arrLen = startWeek * 1 + dayNums * 1;
      for (var i = 0; i < arrLen; i++) {
        if (i >= startWeek) {
          num = i - startWeek + 1;
          var month_day = year + '-' + (month < 10 ? '0' + month : month) + '-' + (num < 10 ? '0' + num : num);
          obj = {
            /*
            * 返回值说明
            * today ： 2018-12-27 当前时间
            * dateNum :  27
            */
            today: year + '-' + (month < 10 ? '0' + month : month) + '-' + (num < 10 ? '0' + num : num),
            dateNum: hour < 6 && month_day === yesterday ? dayjs(this.data.systimestr).date() : num,
            // dateNum: now_today === month_day ? '今天' : num,
            // price: (new Date(now_today) <= new Date(month_day)) ?'￥234':'',
            // canclick: (new Date(now_today) <= new Date(month_day)) ? true : false,
            // price: (new Date(now_today) <= new Date(month_day)) ? num % 5 == 0 ? '' : '￥234':'',
            price: '',
            // canclick: (new Date(now_today) <= new Date(month_day)) ? num % 5== 0 ? 1 : 2 : 0,//0表示今天之前的日期1表示无房2表示有房可点
            canclick: (new Date(now_today) <= new Date(month_day) || (hour < 6 && month_day === yesterday)) ? 2 : 0,
            // wufang: num % 5 == 0 ? (new Date(now_today) <= new Date(month_day))?'无房':'':''
            wufang: ''
          }
          if (hour < 6 && month_day === yesterday) {
            obj.datetext = '今日凌晨'
          } else if (hour < 6 && month_day === now_today) {
            obj.datetext = '今日中午'
          }
        } else {
          // 填补空缺
          // 例如2018-12月第一天是星期6，则需要补6个空格
          obj = {};
        }
        dateArr[i] = obj;
      };
      return dateArr;
    },
    // 点击了日期，选择入住时间或者离店时间
    dayClick(e) {
      var that = this;
      var eTime = e.currentTarget.dataset.day;
      var canclick = e.currentTarget.dataset.canclick;
      var id = e.currentTarget.id;
      var title = e.currentTarget.dataset.title;
      var price = e.currentTarget.dataset.price;

      let { inTime, outTime, rangeDays, priceGetting } = that.data

      if (priceGetting) {
        return
      }

      if (eTime == inTime && outTime == '') {
        // 点击时间为入住时间且没有离开时间，则取消当前入住时间，防止开始时间为今天但第二天无房导致不能点击
        that.setData({
          inTime: ''
        })
        return
      }
      
      if (canclick == 0 || canclick == null)
      return;
      if (inTime == '' || (new Date(eTime) <= new Date(inTime)) || outTime != '') {
        // 没有入驻时间 or 当前点击时间在入驻时间之前 or 有离开时间
        // if(canclick == 1) // 无房
        // return;
        // 如果入住时间为空或选择的时间小于等于入住时间，则选择的时间为入住时间
        inTime = eTime;
        outTime = '';
        if (canclick == 2 && price == '') {
          that.getPriceRange(eTime, dayjs(eTime).add(rangeDays, 'day').format('YYYY-MM-DD'))
        }
        
      } else {
        outTime = eTime;
        var istrue = that.juge_same_date(that.getAll(inTime, outTime), that.out_canclick());
        if (istrue){
          wx.showToast({
            title: '所选时间段包含无房日期',
            icon: 'none',
          })
        }
        // if (istrue) 
        // return;
        that.data.old_id = id;
        that.data.old_title = title;
        setTimeout(function() {
          that.triggerEvent('completed', { inTime, outTime })
        }, 500)
      }
      that.setData({
        inTime,
        outTime,
        old_id: that.data.old_id,
        calendar: that.data.calendar
      })
    },
  
  // 获取所有包含无房的时间
    out_canclick(){
      var that = this;
      var arry_year=[];
      for (var key in that.data.calendar){
      var arry = that.data.calendar[key];
      var size = arry.length;
        for (var i = 0; i < size; i++) {
          if (arry[i]['canclick']==1){
            arry_year.push(arry[i]['today']);
          }
        }
      }
      return arry_year;
    },
    getTimes: function (nS) {
      var date = new Date(parseInt(nS));
      var year = date.getFullYear();
      var mon = date.getMonth() + 1;
      var day = date.getDate();
      var hours = date.getHours();
      var minu = date.getMinutes();
      var sec = date.getSeconds();
  
      return year + '-' + (mon < 10 ? '0' + mon : mon) + '-' + (day < 10 ? '0' + day : day);
    },
    //获取点击范围内的时间段
    getAll: function (begin, end) {		
      var vm =this;
        // 开始日期和结束日期
      if (!begin || !end) {			// 去除空的可能性
        wx.showToast({
          title: '选择的时间不能为空哦~',
          icon: 'none'
        })
        return false;
      }
      // 在时间Date的原型中定义一个format方法
      Date.prototype.format = function () {
        var s = "";				// 定义一个字符串，目的，要时间格式按照我们的要求拼接
        var month = vm.getMonth() + 1;
        var day = vm.getDate();
        s += vm.getFullYear() + "-";
        s += '0' + month + "-";
        s += day;
        return s;			// 得到的格式如 "2018-11-20" 
      }
      var ab = begin.split('-');			// 把日期参数分割，注意，如果以'/'连接，则分割'/'
      var ae = end.split('-');
      var db = new Date(this.data.systimestr);
      db.setUTCFullYear(ab[0], ab[1] - 1, ab[2]);			// 返回符合UTC的时间格式
      var de = new Date(this.data.systimestr);
      de.setUTCFullYear(ae[0], ae[1] - 1, ae[2]);
      var unixDb = db.getTime();
      var unixDe = de.getTime();
      // console.log(unixDb);
      var arr = [];
      for (var k = unixDb; k <= unixDe;) {
        arr.push(vm.getTimes(parseInt(k)));
        k = k + 24 * 60 * 60 * 1000;
      }
      return arr;			// 返回两个日期之间的所有日期数组。
    },
  
    // 判断两个时间里面有没有相同的时间
    juge_same_date(arry1,arry2){
      return arry1.some(item => arry2.includes(item))
    },

    /**
     * 获取指定日期内价格
     * @param {String} enter 开始日期
     * @param {String} leave 结束日期
     */
    getPriceRange: function(enter, leave) {
      const { hotelId } = this.data
      const that = this
      if (!hotelId) {
        this.setDefault()
        return
      }
      this.setData({ priceGetting: true })
      App._postNetWork({
        url: App.getNetAddresss('plugin.hotel.frontend.hotel.hotel.getRoomPriceRangeByHotelId'),
        data: {
          hotel_id: hotelId,
          enter_at: enter,
          leave_at: leave
        },
        success: function(res) {
          const { result, data } = res.data
          if (result == 1 && data && data.length) {
            that.setDayPrice(data)
          }
        },
        complete: function () {
          that.setData({ priceGetting: false })
        }
      })
    },

    /**
     * 设置日历上的价格or无房
     * @param {Array}} list 日期/价格列表
     */
    setDayPrice: function(list) {
      const { calendar, inTime } = this.data
      list.forEach(item => {
        let month = dayjs(item.date).format('YYYY年MM月')
        if (!calendar[month]) {
          // 结果超出日历
          return
        }
        let currentMonthDays = calendar[month].find(day => day.today == item.date)
        if (item.is_has_house == 0) {
          // 无房
          currentMonthDays.wufang = '无房'
          currentMonthDays.canclick = 1
        } else {
          // 有房
          currentMonthDays.price = `¥${item.price}`
          currentMonthDays.canclick = 2
        }
        if (item.date == inTime && item.is_has_house == 0) {
          // 入驻日期无房
          this.setData({ 
            inTime: '',
            outTime: '',
            old_id: -1,
            old_title: ''
          })
          App.tips('抱歉，当前日期无房')
        }
      })
      this.setData({ calendar })
      this.setDefault()
    },

    /**
     * 设置默认选中范围
     */
    setDefault: function() {
      const { isSetDefault, startTime, endTime, calendar } = this.data
      if (isSetDefault) {
        // 已设置过时间范围
        return
      }
      this.setData({ isSetDefault: true })
      // let startMonth = dayjs(startTime).format('YYYY年MM月')
      // let currentStartMonthDays = calendar[startMonth].find(item => item.today == startTime)
      // if (currentStartMonthDays.canclick == 1) {
      //   // 开始入驻日期无房
      //   return
      // }
      this.setData({
        inTime: startTime
      })

      let endMonth = dayjs(endTime).format('YYYY年MM月')
      let currentEndMonthDaysIndex = calendar[endMonth].findIndex(item => item.today == endTime)
      const istrue = this.juge_same_date(this.getAll(startTime, endTime), this.out_canclick());
      if (istrue) {
        // 开始日期到结束日期中间存在无房
        wx.showToast({
          title: '所选时间段包含无房日期',
          icon: 'none',
        })
      } 
        // return
      const old_id = currentEndMonthDaysIndex
      const old_title = endMonth
      this.setData({
        outTime: endTime,
        old_id,
        old_title
      })
    },

    /**
     * 滚动至入驻开始日期所在月份
     * @param {String} date 开始入驻日期
     */
    scrollTo: function(date) {
      if (!date) {
        return
      }
      const { calendar } = this.data
      let topView = 0
      const month = dayjs(date).format('YYYY-MM')
      Object.keys(calendar).forEach(key => {
        const keyStr = key.replace('年', '-').replace('月', '')
        const isBefore = dayjs(keyStr).isBefore(dayjs(month), 'month')
        if (isBefore) {
          const datesLength = calendar[key].length;
          const dateCol = Math.ceil(datesLength / 7);
          topView += 45 + dateCol * 85;
        }
      })
      this.setData({ topView })
    }
  },
});
